/*************************************************
 ** preload为预加载模块，该文件将会在程序启动时加载 **
 ** 用于初始化一些基础服务，如托盘、安全、自动更新等 **
 *************************************************/

// 导入日志模块，用于记录日志
const { logger } = require('ee-core/log');
// 导入托盘服务，用于创建系统托盘图标
const { trayService } = require('../service/os/tray');
// 导入安全服务，用于处理应用的安全策略
const { securityService } = require('../service/os/security');
// 导入自动更新服务，用于处理应用的自动更新
const { autoUpdaterService } = require('../service/os/auto_updater');

const { ipcMain, BrowserWindow } = require('electron');
const path = require('path');
const url = require('url');

/**
 * 预加载函数
 * 在应用启动时执行，用于初始化一些基础服务
 * 这些服务会在应用的整个生命周期中持续运行
 */
function preload() {
  // 示例功能模块，可选择性使用和修改
  logger.info('[preload] load 5');
  // 创建系统托盘图标
  trayService.create();
  // 创建安全服务
  securityService.create();
  // 创建自动更新服务
  autoUpdaterService.create();

  // 注册on-open-event事件处理器
  ipcMain.handle('on-open-event', async (event, args) => {
    try {
      // 解构参数
      const { title = '聊天窗口', width = 800, height = 600, url: contentUrl, index } = args;
      
      console.log('---窗口化参数完整信息---');
      console.log('标题:', title);
      console.log('宽度:', width, '高度:', height);
      console.log('内容URL:', contentUrl);
      console.log('聊天ID:', index);
      console.log('原始参数:', args);
      
      // 获取应用根目录
      const appPath = process.cwd();
      console.log('应用根目录:', appPath);
      
      // 创建浏览器窗口
      const win = new BrowserWindow({
          width: width,
          height: height,
          title: title,
          webPreferences: {
              nodeIntegration: true,
              contextIsolation: false,
              enableRemoteModule: true,
              webSecurity: false, // 关闭web安全限制以解决图片显示问题
              allowRunningInsecureContent: false, // 禁止运行不安全的内容
              sandbox: false, // 因为需要nodeIntegration，所以禁用沙箱
              // 添加额外的安全参数
              additionalArguments: [
                  `--disable-features=OutOfBlinkCors`,
                  `--disable-site-isolation-trials`,
                  `--disable-features=BlockInsecurePrivateNetworkRequests`,
              ]
          }
      });
      
      console.log('窗口创建成功, ID:', win.id);
      
      // 判断是否是web url
      const isWebUrl = contentUrl && (contentUrl.startsWith('http:') || contentUrl.startsWith('https:'));
      
      // 从主窗口获取当前页面的URL
      const currentURL = event.sender.getURL();
      console.log('主窗口URL:', currentURL);
      
      // 确保index参数存在且传递正确
      if (args.index) {
        console.log('设置窗口数据:', { index: args.index });
        
        // 设置窗口数据，可以在渲染进程中通过remote获取
        win.chatData = {
          index: args.index
        };
      }
      
      if (isWebUrl) {
          // 加载外部URL
          win.loadURL(contentUrl);
      } else if (contentUrl && contentUrl.startsWith('#/')) {
          // 正确构建URL，确保使用hash路由方式
          const mainUrl = url.format({
              pathname: path.join(appPath, 'public/dist/index.html'),
              protocol: 'file:',
              slashes: true
          }) + contentUrl;  // 直接拼接hash部分
          
          console.log('加载的完整URL:', mainUrl);
          
          // 加载URL
          await win.loadURL(mainUrl);
          console.log('URL加载完成');
          
          // 打开开发者工具查看问题
          win.webContents.openDevTools();
          
          // 注入参数到页面
          win.webContents.on('did-finish-load', () => {
              console.log('页面加载完成，注入数据');
              
              // 获取主窗口中的store数据
              const mainWindow = BrowserWindow.getAllWindows().find(w => w.id !== win.id);
              if (mainWindow) {
                  // 先从主窗口获取聊天数据
                  mainWindow.webContents.executeJavaScript(`
                      (() => {
                          try {
                              if (window.$store && window.$store.state && window.$store.state.chatStore) {
                                  const chatData = window.$store.state.chatStore.chats.find(c => c.targetId == "${args.index}");
                                  return JSON.stringify(chatData || null);
                              }
                              return "null";
                          } catch (e) {
                              console.error("获取聊天数据失败:", e);
                              return "null";
                          }
                      })();
                  `).then(chatDataStr => {
                      console.log('从主窗口获取到的聊天数据:', chatDataStr);
                      
                      // 将获取到的数据注入到新窗口
                      win.webContents.executeJavaScript(`
                          console.log('向页面中注入数据');
                          window.chatData = ${JSON.stringify({ index: args.index })};
                          window.chatFullData = ${chatDataStr !== "null" ? chatDataStr : "null"};
                          
                          // 如果还没有初始化store
                          if (window.$store && window.$store.state && window.$store.state.chatStore) {
                              // 将数据同步到store
                              if (window.chatFullData) {
                                  console.log('同步聊天数据到store');
                                  // 确保聊天数据在store中存在
                                  const exists = window.$store.state.chatStore.chats.some(c => c.targetId == "${args.index}");
                                  if (!exists && window.chatFullData) {
                                      window.$store.state.chatStore.chats.push(window.chatFullData);
                                  }
                                  // 设置活动聊天
                                  window.$store.commit("getactiveChat", "${args.index}");
                              }
                          } else {
                              console.log('Store未初始化，将在Store初始化后同步数据');
                              // 创建一个全局函数，等待Store初始化
                              window.__syncChatData = function() {
                                  if (window.chatFullData && window.$store && window.$store.state && window.$store.state.chatStore) {
                                      const exists = window.$store.state.chatStore.chats.some(c => c.targetId == "${args.index}");
                                      if (!exists && window.chatFullData) {
                                          window.$store.state.chatStore.chats.push(window.chatFullData);
                                      }
                                      window.$store.commit("getactiveChat", "${args.index}");
                                  }
                              };
                          }
                          
                          console.log('注入的数据:', window.chatData);
                          console.log('注入的完整聊天数据:', window.chatFullData);
                      `).catch(err => console.error('注入数据出错:', err));
                  }).catch(err => console.error('从主窗口获取数据失败:', err));
              } else {
                  // 如果找不到主窗口，只注入基本数据
                  win.webContents.executeJavaScript(`
                      console.log('向页面中注入基本数据');
                      window.chatData = ${JSON.stringify({ index: args.index })};
                      console.log('注入的数据:', window.chatData);
                  `).catch(err => console.error('注入数据出错:', err));
              }
          });
          
          // 监听加载失败事件
          win.webContents.on('did-fail-load', (event, errorCode, errorDescription) => {
              console.log('页面加载失败:', errorCode, errorDescription);
          });
      } else {
          // 加载默认页面
          const defaultUrl = url.format({
              pathname: path.join(appPath, 'public/dist/index.html'),
              protocol: 'file:',
              slashes: true
          });
          console.log('加载默认URL:', defaultUrl);
          win.loadURL(defaultUrl);
      }
      
      // 窗口关闭时通知渲染进程
      win.on('closed', () => {
          console.log('窗口已关闭, ID:', win.id);
          // 通知主窗口窗口已关闭
          BrowserWindow.getAllWindows().forEach(window => {
              if (window.id !== win.id) {
                  window.webContents.send('window-closed', {
                      index: index
                  });
              }
          });
      });
      
      return { success: true, id: win.id };
    } catch (error) {
      console.error('创建窗口发生错误:', error);
      return { success: false, error: error.message };
    }
  });
}

/**
* 预加载模块入口
* 导出preload函数供main.js调用
*/
module.exports = {
  preload
}